Aide pour la compréhension du 7.18.6 et la réalisation du 7.18.8

Dans la classe UserInterface du projet zuul-with-images de l'exercice 7.18.6, on utilise l'interface ActionListener (qui contient uniquement la méthode actionPerformed), mais il y a 3 façons d'ajouter un "écouteur d'action" à un composant, tel qu'un bouton ou un champ de saisie :

1) la plus simple (sauf s'il y a beaucoup de composants) :
  bouton.addActionListener( this );
     ==> la classe courante contient directement la méthode actionPerformed

2) la plus claire (mais peut créer beaucoup de classes) :
  bouton.addActionListener( myButtonListener );
     ==> myButtonListener est une instance d'une classe (à créer) contenant la méthode actionPerformed

3) la plus élégante (surtout lorsqu'il y a beaucoup de composants) :
  bouton.addActionListener( new ActionListener() {
    public void actionPerformed(...) { instructions }
  }
);

     ==> On crée une classe anonyme (puisqu'on ne lui donne pas de nom, le compilateur s'en chargera -- voir ci-dessous --) qui implémente l'interface ActionListener et donc contient juste la méthode actionPerformed.
Cette écriture est équivalente à (remplace avantageusement) :
private class MaClasse$1 implements ActionListener {
  public void actionPerformed(...) { instructions }
} // MaClasse$1
bouton.addActionListener( new MaClasse$1() );